package com.gcxy.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.gcxy.core.PageVO;
import com.gcxy.core.R;
import com.gcxy.dto.export.DownloadFileDTO;
import com.gcxy.dto.weekly.UpdateWeeklyDTO;
import com.gcxy.dto.student.ScheduledTasksDTO;

import com.gcxy.dto.weekly.WeeklyEvaluateDTO;
import com.gcxy.dto.weekly.WeeklyPageDTO;
import com.gcxy.dto.weekly.WeeklyReviewDTO;
import com.gcxy.entity.Weekly;
import com.gcxy.entity.WeeklyProject;
import com.gcxy.vo.weekly.WeeklyAppraiseVO;
import com.gcxy.vo.weekly.WeeklyPageVO;

import java.util.List;

/**
 * <p>
 * 周报信息 服务类
 * </p>
 *
 * @author Huang先森
 * @since 2024-07-22
 */
public interface WeeklyService extends IService<Weekly> {

    /**
     * 定时生成周报
     *
     * @param scheduledTasksDTO
     * @return
     */
    R<?> addWeeklyScheduled(ScheduledTasksDTO scheduledTasksDTO);

    /**
     * 手动执行定时任务
     */
    void manualExecutionScheduled();

    /**
     * 生成周报
     *
     * @param agencyId
     */
    void addWeekly(Integer agencyId);

    /**
     * 修改周报
     *
     * @param updateWeeklyDTO
     * @return
     */
    R<?> updateWeekly(UpdateWeeklyDTO updateWeeklyDTO);

    /**
     * 周报评阅
     *
     * @param weeklyReviewDTO
     * @return
     */
    R<?> weeklyReview(WeeklyReviewDTO weeklyReviewDTO);

    /**
     * 周报分页查询
     *
     * @param weeklyPageDTO
     * @return
     */
    R<PageVO<WeeklyPageVO>> getWeeklyByPage(WeeklyPageDTO weeklyPageDTO);

    /**
     * 根据id获取周报信息
     *
     * @param weeklyId
     * @return
     */
    R<WeeklyAppraiseVO> getWeeklyById(Integer weeklyId);

    /**
     * 获取当前学期周数信息
     *
     * @return
     */
    R<List<Integer>> getWeekNum(Integer semesterId);

    /**
     * 根据学期id、周数、学生id获取当前周报信息
     *
     * @param semesterId
     * @param weekNum
     * @param studentId
     * @return
     */
    Weekly getWeeklyInfo(Integer semesterId, Integer weekNum, Integer studentId);

    /**
     * 获取学生上一周的项目
     *
     * @param semesterId
     * @param weekNum
     * @param studentId
     * @return
     */
    List<WeeklyProject> getLastWeeklyProjectId(Integer semesterId, Integer weekNum, Integer studentId);

    /**
     * 获取学生未绑定教师的周报信息
     *
     * @param studentId
     * @param semesterId
     * @return
     */
    List<Weekly> getNoTeacherWeeklyList(Integer studentId, Integer semesterId);

    /**
     * 获取当前组织下学期内本周的周报信息
     *
     * @param semesterId
     * @param agencyId
     * @return
     */
    List<Weekly> getWeeklyList(Integer semesterId, Integer agencyId);

    /**
     * 根据实际教师获取指定周内的周报
     * @param semesterId
     * @param practicalTeacherId
     * @param weekNum
     * @return
     */
    List<Weekly> getWeeklyListByPracticalTeacherId(Integer semesterId, Integer practicalTeacherId, Integer weekNum);

    /**
     * 根据名誉教师获取指定周内的周报
     * @param semesterId
     * @param honoraryTeacherId
     * @param weekNum
     * @return
     */
    List<Weekly> getWeeklyListByHonoraryTeacherId(Integer semesterId, Integer honoraryTeacherId, Integer weekNum);

    /**
     * 获取当前教师对应学生的周评价信息
     * @param weekNum
     * @param honoraryTeacherId
     * @return
     */
    String getAppraise(Integer semesterId, Integer honoraryTeacherId, Integer weekNum);

    /**
     * 获取Excel学生周评分表信息
     * @param dto
     * @return
     */
    R<?> createEvaluateFile(DownloadFileDTO dto);

    /**
     * 生成周报文件
     *
     * @param dto
     */
    R<?> createWeeklyFile(DownloadFileDTO dto);
}
